package com.example.aihub.service.impl;

import com.example.aihub.entity.Comment;
import com.example.aihub.entity.Post;
import com.example.aihub.entity.User;
import com.example.aihub.repository.CommentRepository;
import com.example.aihub.repository.PostRepository;
import com.example.aihub.service.CommentService;
import com.example.aihub.exception.ResourceNotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

/**
 * 评论服务实现类
 * 处理评论的创建、回复、查询、更新和删除等操作
 */
@Service
public class CommentServiceImpl implements CommentService {

    private final CommentRepository commentRepository;
    private final PostRepository postRepository;

    /**
     * 构造函数
     * @param commentRepository 评论仓库
     * @param postRepository 帖子仓库
     */
    @Autowired
    public CommentServiceImpl(CommentRepository commentRepository, PostRepository postRepository) {
        this.commentRepository = commentRepository;
        this.postRepository = postRepository;
    }

    /**
     * 创建新评论
     * @param comment 评论对象
     * @return 保存后的评论对象
     */
    @Override
    public Comment createComment(Comment comment) {
        // 保存评论
        Comment savedComment = commentRepository.save(comment);

        // 更新帖子的评论计数
        Post post = savedComment.getPost();
        post.setCommentCount(post.getCommentCount() + 1);
        postRepository.save(post);

        return savedComment;
    }

    /**
     * 回复评论
     * @param commentId 被回复的评论ID
     * @param reply 回复评论对象
     * @return 保存后的回复评论
     * @throws ResourceNotFoundException 当被回复的评论不存在时抛出
     */
    @Override
    public Comment replyToComment(Long commentId, Comment reply) {
        Comment parentComment = commentRepository.findById(commentId)
                .orElseThrow(() -> new ResourceNotFoundException("评论不存在: " + commentId));

        reply.setParentComment(parentComment);
        reply.setPost(parentComment.getPost());

        return commentRepository.save(reply);
    }

    /**
     * 删除评论
     * @param id 评论ID
     * @throws ResourceNotFoundException 当评论不存在时抛出
     */
    @Override
    public void deleteComment(Long id) {
        Comment comment = commentRepository.findById(id)
                .orElseThrow(() -> new ResourceNotFoundException("评论不存在: " + id));

        // 更新帖子的评论计数
        Post post = comment.getPost();
        post.setCommentCount(post.getCommentCount() - 1);
        postRepository.save(post);

        commentRepository.deleteById(id);
    }

    /**
     * 根据帖子获取评论列表
     * @param post 帖子对象
     * @return 评论列表
     */
    @Override
    public List<Comment> getCommentsByPost(Post post) {
        return commentRepository.findByPost(post);
    }

    /**
     * 根据帖子ID获取评论列表
     * @param postId 帖子ID
     * @return 评论列表
     * @throws ResourceNotFoundException 当帖子不存在时抛出
     */
    @Override
    public List<Comment> getCommentsByPostId(Long postId) {
        Post post = postRepository.findById(postId)
                .orElseThrow(() -> new ResourceNotFoundException("帖子不存在: " + postId));
        return commentRepository.findByPost(post);
    }

    /**
     * 根据ID获取评论
     * @param id 评论ID
     * @return 评论对象的Optional包装
     */
    @Override
    public Optional<Comment> getCommentById(Long id) {
        return commentRepository.findById(id);
    }

    /**
     * 更新评论
     * @param comment 包含更新信息的评论对象
     * @return 更新后的评论对象
     * @throws ResourceNotFoundException 当评论不存在时抛出
     */
    @Override
    public Comment updateComment(Comment comment) {
        // 检查评论是否存在
        if (!commentRepository.existsById(comment.getId())) {
            throw new ResourceNotFoundException("评论不存在: " + comment.getId());
        }
        // 保存更新后的评论
        return commentRepository.save(comment);
    }
}